home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 February / EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso / earcd / assembler / progasm2.lha / SORGENTI6 / LEZIONE10u1.s / LEZIONE10u1.s
Text File  |  1995-10-23  |  14KB  |  435 lines

  1.  
  2. ; Lezione10u1.s    Linea in movimento
  3. ;        tasto sinistro per uscire
  4.  
  5.     SECTION    CiriCop,CODE
  6.  
  7. ;    Include    "DaWorkBench.s"    ; togliere il ; prima di salvare con "WO"
  8.  
  9. *****************************************************************************
  10.     include    "startup1.s"    ; Salva Copperlist Etc.
  11. *****************************************************************************
  12.  
  13.         ;5432109876543210
  14. DMASET    EQU    %1000001111000000    ; copper,bitplane,blitter DMA
  15.  
  16.  
  17. START:
  18. ;    Puntiamo la PIC "vuota"
  19.  
  20.     MOVE.L    #BITPLANE,d0    ; dove puntare
  21.     LEA    BPLPOINTERS,A1    ; puntatori COP
  22.     move.w    d0,6(a1)
  23.     swap    d0
  24.     move.w    d0,2(a1)
  25.  
  26.     lea    $dff000,a5        ; CUSTOM REGISTER in a5
  27.     MOVE.W    #DMASET,$96(a5)        ; DMACON - abilita bitplane, copper
  28.     move.l    #COPPERLIST,$80(a5)    ; Puntiamo la nostra COP
  29.     move.w    d0,$88(a5)        ; Facciamo partire la COP
  30.     move.w    #0,$1fc(a5)        ; Disattiva l'AGA
  31.     move.w    #$c00,$106(a5)        ; Disattiva l'AGA
  32.     move.w    #$11,$10c(a5)        ; Disattiva l'AGA
  33.  
  34.     bsr.w    InitLine    ; inizializza line-mode
  35.  
  36.     move.w    #$ffff,d0    ; linea continua
  37.     bsr.w    SetPattern    ; definisce pattern
  38.  
  39. mouse:
  40.     MOVE.L    #$1ff00,d1    ; bit per la selezione tramite AND
  41.     MOVE.L    #$12c00,d2    ; linea da aspettare = $12c
  42. Waity1:
  43.     MOVE.L    4(A5),D0    ; VPOSR e VHPOSR - $dff004/$dff006
  44.     ANDI.L    D1,D0        ; Seleziona solo i bit della pos. verticale
  45.     CMPI.L    D2,D0        ; aspetta la linea $12c
  46.     BNE.S    Waity1
  47.  
  48.     bsr.w    CancellaSchermo    ; pulisce lo schermo
  49.  
  50.     bsr.s    MuoviPunti    ; modifica le coordinate dei punti
  51.  
  52. ; disegna la linea
  53.  
  54.     move.w    CoordX1(pc),d0    ; legge le coordinate dei punti
  55.     move.w    CoordY1(pc),d1
  56.     move.w    CoordX2(pc),d2
  57.     move.w    CoordY2(pc),d3
  58.     lea    bitplane,a0
  59.     bsr.w    Drawline
  60.  
  61.     btst    #6,$bfe001    ; mouse premuto?
  62.     bne.w    mouse
  63.     rts
  64.  
  65. ;***************************************************************************
  66. ; Questa routine legge da tabelle le coordinate dei vari punti e le
  67. ; memorizza nelle apposite variabili.
  68. ; La lettura dalle tabelle viene effettuata mediante l'indirizzamento indiretto
  69. ; con indice. Per spostarci all'interno delle tabelle modifichiamo gli indici
  70. ; (che sono words) invece che i puntatori (longwords). Cio` ci permette di
  71. ; evitare di fuoriuscire dalla tabella con una semplice AND che mantiene
  72. ; l'indice compreso nell'intervallo 0 - 512 (infatti le tabelle sono composte
  73. ; da 256 valori words (512 bytes).
  74. ;***************************************************************************
  75.  
  76. ;      @..@
  77. ;     (----)
  78. ;    ( >__< )
  79. ;    ^^ ~~ ^^
  80.  
  81. MuoviPunti:
  82.     lea    TabX(pc),a0
  83.  
  84. ; coordinata X1
  85.  
  86.     move.w    indiceX1(pc),d0        ; indice della coordinata precedente
  87.     add.w    addX1(pc),d0        ; modifica l'indice per puntare
  88.                     ; la nuova coordinata
  89.     and.w    #$1FF,d0        ; tiene l'indice all'interno della
  90.                     ; tabella
  91.     move.w    d0,indiceX1        ; memorizza l'indice
  92.     move.w    0(a0,d0.w),d1        ; legge la coordinata dalla tabella
  93.     move.w    d1,CoordX1        ; copia la coordinata nella variabile
  94.  
  95. ; coordinata X2
  96.  
  97.     move.w    indiceX2(pc),d0        ; indice della coordinata precedente
  98.     add.w    addX2(pc),d0        ; modifica l'indice per puntare
  99.                     ; la nuova coordinata
  100.     and.w    #$1FF,d0        ; tiene l'indice all'interno della
  101.                     ; tabella
  102.     move.w    d0,indiceX2        ; memorizza l'indice
  103.     move.w    0(a0,d0.w),d1        ; legge la coordinata dalla tabella
  104.     move.w    d1,CoordX2        ; copia la coordinata nella variabile
  105.  
  106.     lea    TabY(pc),a0
  107.  
  108. ; coordinata Y1
  109.  
  110.     move.w    indiceY1(pc),d0        ; indice della coordinata precedente
  111.     add.w    addY1(pc),d0        ; modifica l'indice per puntare
  112.                     ; la nuova coordinata
  113.     and.w    #$1FF,d0        ; tiene l'indice all'interno della
  114.                     ; tabella
  115.     move.w    d0,indiceY1        ; memorizza l'indice
  116.     move.w    0(a0,d0.w),d1        ; legge la coordinata dalla tabella
  117.     move.w    d1,CoordY1        ; copia la coordinata nella variabile
  118.  
  119. ; coordinata Y2
  120.  
  121.     move.w    indiceY2(pc),d0        ; indice della coordinata precedente
  122.     add.w    addY2(pc),d0        ; modifica l'indice per puntare
  123.                     ; la nuova coordinata
  124.     and.w    #$1FF,d0        ; tiene l'indice all'interno della
  125.                     ; tabella
  126.     move.w    d0,indiceY2        ; memorizza l'indice
  127.     move.w    0(a0,d0.w),d1        ; legge la coordinata dalla tabella
  128.     move.w    d1,CoordY2        ; copia la coordinata nella variabile
  129.  
  130.     rts
  131.  
  132. ; questa tabella contiene le coordinate X
  133.  
  134. TabX:
  135.     DC.W    $00A2,$00A6,$00A9,$00AD,$00B1,$00B4,$00B8,$00BB,$00BF,$00C3
  136.     DC.W    $00C6,$00CA,$00CD,$00D1,$00D4,$00D8,$00DB,$00DE,$00E2,$00E5
  137.     DC.W    $00E8,$00EC,$00EF,$00F2,$00F5,$00F8,$00FB,$00FE,$0101,$0103
  138.     DC.W    $0106,$0109,$010B,$010E,$0110,$0113,$0115,$0117,$011A,$011C
  139.     DC.W    $011E,$0120,$0122,$0123,$0125,$0127,$0128,$012A,$012B,$012D
  140.     DC.W    $012E,$012F,$0130,$0131,$0132,$0133,$0133,$0134,$0135,$0135
  141.     DC.W    $0135,$0136,$0136,$0136,$0136,$0136,$0136,$0135,$0135,$0135
  142.     DC.W    $0134,$0133,$0133,$0132,$0131,$0130,$012F,$012E,$012D,$012B
  143.     DC.W    $012A,$0128,$0127,$0125,$0123,$0122,$0120,$011E,$011C,$011A
  144.     DC.W    $0117,$0115,$0113,$0110,$010E,$010B,$0109,$0106,$0103,$0101
  145.     DC.W    $00FE,$00FB,$00F8,$00F5,$00F2,$00EF,$00EC,$00E8,$00E5,$00E2
  146.     DC.W    $00DE,$00DB,$00D8,$00D4,$00D1,$00CD,$00CA,$00C6,$00C3,$00BF
  147.     DC.W    $00BB,$00B8,$00B4,$00B1,$00AD,$00A9,$00A6,$00A2,$009E,$009A
  148.     DC.W    $0097,$0093,$008F,$008C,$0088,$0085,$0081,$007D,$007A,$0076
  149.     DC.W    $0073,$006F,$006C,$0068,$0065,$0062,$005E,$005B,$0058,$0054
  150.     DC.W    $0051,$004E,$004B,$0048,$0045,$0042,$003F,$003D,$003A,$0037
  151.     DC.W    $0035,$0032,$0030,$002D,$002B,$0029,$0026,$0024,$0022,$0020
  152.     DC.W    $001E,$001D,$001B,$0019,$0018,$0016,$0015,$0013,$0012,$0011
  153.     DC.W    $0010,$000F,$000E,$000D,$000D,$000C,$000B,$000B,$000B,$000A
  154.     DC.W    $000A,$000A,$000A,$000A,$000A,$000B,$000B,$000B,$000C,$000D
  155.     DC.W    $000D,$000E,$000F,$0010,$0011,$0012,$0013,$0015,$0016,$0018
  156.     DC.W    $0019,$001B,$001D,$001E,$0020,$0022,$0024,$0026,$0029,$002B
  157.     DC.W    $002D,$0030,$0032,$0035,$0037,$003A,$003D,$003F,$0042,$0045
  158.     DC.W    $0048,$004B,$004E,$0051,$0054,$0058,$005B,$005E,$0062,$0065
  159.     DC.W    $0068,$006C,$006F,$0073,$0076,$007A,$007D,$0081,$0085,$0088
  160.     DC.W    $008C,$008F,$0093,$0097,$009A,$009E
  161.  
  162. ; questa tabella contiene le coordinate Y
  163.  
  164. TabY:
  165.     DC.W    $0080,$0083,$0086,$0088,$008B,$008E,$0090,$0093,$0096,$0098
  166.     DC.W    $009B,$009E,$00A0,$00A3,$00A5,$00A8,$00AA,$00AD,$00AF,$00B2
  167.     DC.W    $00B4,$00B6,$00B9,$00BB,$00BD,$00BF,$00C2,$00C4,$00C6,$00C8
  168.     DC.W    $00CA,$00CC,$00CE,$00D0,$00D1,$00D3,$00D5,$00D7,$00D8,$00DA
  169.     DC.W    $00DB,$00DD,$00DE,$00DF,$00E1,$00E2,$00E3,$00E4,$00E5,$00E6
  170.     DC.W    $00E7,$00E8,$00E9,$00E9,$00EA,$00EB,$00EB,$00EC,$00EC,$00EC
  171.     DC.W    $00ED,$00ED,$00ED,$00ED,$00ED,$00ED,$00ED,$00ED,$00EC,$00EC
  172.     DC.W    $00EC,$00EB,$00EB,$00EA,$00E9,$00E9,$00E8,$00E7,$00E6,$00E5
  173.     DC.W    $00E4,$00E3,$00E2,$00E1,$00DF,$00DE,$00DD,$00DB,$00DA,$00D8
  174.     DC.W    $00D7,$00D5,$00D3,$00D1,$00D0,$00CE,$00CC,$00CA,$00C8,$00C6
  175.     DC.W    $00C4,$00C2,$00BF,$00BD,$00BB,$00B9,$00B6,$00B4,$00B2,$00AF
  176.     DC.W    $00AD,$00AA,$00A8,$00A5,$00A3,$00A0,$009E,$009B,$0098,$0096
  177.     DC.W    $0093,$0090,$008E,$008B,$0088,$0086,$0083,$0080,$007E,$007B
  178.     DC.W    $0078,$0076,$0073,$0070,$006E,$006B,$0068,$0066,$0063,$0060
  179.     DC.W    $005E,$005B,$0059,$0056,$0054,$0051,$004F,$004C,$004A,$0048
  180.     DC.W    $0045,$0043,$0041,$003F,$003C,$003A,$0038,$0036,$0034,$0032
  181.     DC.W    $0030,$002E,$002D,$002B,$0029,$0027,$0026,$0024,$0023,$0021
  182.     DC.W    $0020,$001F,$001D,$001C,$001B,$001A,$0019,$0018,$0017,$0016
  183.     DC.W    $0015,$0015,$0014,$0013,$0013,$0012,$0012,$0012,$0011,$0011
  184.     DC.W    $0011,$0011,$0011,$0011,$0011,$0011,$0012,$0012,$0012,$0013
  185.     DC.W    $0013,$0014,$0015,$0015,$0016,$0017,$0018,$0019,$001A,$001B
  186.     DC.W    $001C,$001D,$001F,$0020,$0021,$0023,$0024,$0026,$0027,$0029
  187.     DC.W    $002B,$002D,$002E,$0030,$0032,$0034,$0036,$0038,$003A,$003C
  188.     DC.W    $003F,$0041,$0043,$0045,$0048,$004A,$004C,$004F,$0051,$0054
  189.     DC.W    $0056,$0059,$005B,$005E,$0060,$0063,$0066,$0068,$006B,$006E
  190.     DC.W    $0070,$0073,$0076,$0078,$007B,$007E
  191.  
  192.  
  193. ; Qui sono memorizzate i volta in volta le coordinate dei vertici della linea
  194.  
  195. CoordX1:    dc.w    0
  196. CoordY1:    dc.w    0
  197. CoordX2:    dc.w    0
  198. CoordY2:    dc.w    0
  199.  
  200. ; Qui sono memorizzati per ogni coordinata gli indici all'interno della tabella
  201.  
  202. IndiceX1:    dc.w    10
  203. IndiceY1:    dc.w    20
  204. IndiceX2:    dc.w    30
  205. IndiceY2:    dc.w    0
  206.  
  207. ; Qui sono memorizzati per ogni coordinata i valori da aggiungere di volta
  208. ; in volta agli indici della tabella
  209.  
  210. addX1:    dc.w    -2
  211. addY1:    dc.w    2
  212. addX2:    dc.w    4
  213. addY2:    dc.w    6
  214.  
  215. ;******************************************************************************
  216. ; Questa routine effettua il disegno della linea. prende come parametri gli
  217. ; estremi della linea P1 e P2, e l'indirizzo del bitplane su cui disegnarla.
  218. ; D0 - X1 (coord. X di P1)
  219. ; D1 - Y1 (coord. Y di P1)
  220. ; D2 - X2 (coord. X di P2)
  221. ; D3 - Y2 (coord. Y di P2)
  222. ; A0 - indirizzo bitplane
  223. ;******************************************************************************
  224.  
  225. ; costanti
  226.  
  227. DL_Fill        =    0        ; 0=NOFILL / 1=FILL
  228.  
  229.     IFEQ    DL_Fill
  230. DL_MInterns    =    $CA
  231.     ELSE
  232. DL_MInterns    =    $4A
  233.     ENDC
  234.  
  235.  
  236. DrawLine:
  237.     sub.w    d1,d3    ; D3=Y2-Y1
  238.  
  239.     IFNE    DL_Fill
  240.     beq.s    .end    ; per il fill non servono linee orizzontali 
  241.     ENDC
  242.  
  243.     bgt.s    .y2gy1    ; salta se positivo..
  244.     exg    d0,d2    ; ..altrimenti scambia i punti
  245.     add.w    d3,d1    ; mette in D1 la Y piu` piccola
  246.     neg.w    d3    ; D3=DY
  247. .y2gy1:
  248.     mulu.w    #40,d1        ; offset Y
  249.     add.l    d1,a0
  250.     moveq    #0,d1        ; D1 indice nella tabella ottanti
  251.     sub.w    d0,d2        ; D2=X2-X1
  252.     bge.s    .xdpos        ; salta se positivo..
  253.     addq.w    #2,d1        ; ..altrimenti sposta l'indice
  254.     neg.w    d2        ; e rendi positiva la differenza
  255. .xdpos:
  256.     moveq    #$f,d4        ; maschera per i 4 bit bassi
  257.     and.w    d0,d4        ; selezionali in D4
  258.         
  259.     IFNE    DL_Fill        ; queste istruzioni vengono assemblate
  260.                 ; solo se DL_Fill=1
  261.     move.b    d4,d5        ; calcola numero del bit da invertire
  262.     not.b    d5        ; (la BCHG numera i bit in modo inverso    
  263.     ENDC
  264.  
  265.     lsr.w    #3,d0        ; offset X:
  266.                 ; Allinea a byte (serve per BCHG)
  267.     add.w    d0,a0        ; aggiunge all'indirizzo
  268.                 ; nota che anche se l'indirizzo
  269.                 ; e` dispari non fa nulla perche`
  270.                 ; il blitter non tiene conto del
  271.                 ; bit meno significativo di BLTxPT
  272.  
  273.     ror.w    #4,d4        ; D4 = valore di shift A
  274.     or.w    #$B00+DL_MInterns,d4    ; aggiunge l'opportuno
  275.                     ; Minterm (OR o EOR)
  276.     swap    d4        ; valore di BLTCON0 nella word alta
  277.         
  278.     cmp.w    d2,d3        ; confronta DiffX e DiffY
  279.     bge.s    .dygdx        ; salta se >=0..
  280.     addq.w    #1,d1        ; altrimenti setta il bit 0 del'indice
  281.     exg    d2,d3        ; e scambia le Diff
  282. .dygdx:
  283.     add.w    d2,d2        ; D2 = 2*DiffX
  284.     move.w    d2,d0        ; copia in D0
  285.     sub.w    d3,d0        ; D0 = 2*DiffX-DiffY
  286.     addx.w    d1,d1        ; moltiplica per 2 l'indice e
  287.                 ; contemporaneamente aggiunge il flag
  288.                 ; X che vale 1 se 2*DiffX-DiffY<0
  289.                 ; (settato dalla sub.w)
  290.     move.b    Oktants(PC,d1.w),d4    ; legge l'ottante
  291.     swap    d2            ; valore BLTBMOD in word alta
  292.     move.w    d0,d2            ; word bassa D2=2*DiffX-DiffY
  293.     sub.w    d3,d2            ; word bassa D2=2*DiffX-2*DiffY
  294.     moveq    #6,d1            ; valore di shift e di test per
  295.                     ; la wait blitter 
  296.  
  297.     lsl.w    d1,d3        ; calcola il valore di BLTSIZE
  298.     add.w    #$42,d3
  299.  
  300.     lea    $52(a5),a1    ; A1 = indirizzo BLTAPTL
  301.                 ; scrive alcuni registri
  302.                 ; consecutivamente con delle 
  303.                 ; MOVE #XX,(Ax)+
  304.  
  305.     btst    d1,2(a5)    ; aspetta il blitter
  306. .wb:
  307.     btst    d1,2(a5)
  308.     bne.s    .wb
  309.  
  310.     IFNE    DL_Fill        ; questa istruzione viene assemblata
  311.                 ; solo se DL_Fill=1
  312.     bchg    d5,(a0)        ; Inverte il primo bit della linea
  313.     ENDC
  314.  
  315.     move.l    d4,$40(a5)    ; BLTCON0/1
  316.     move.l    d2,$62(a5)    ; BLTBMOD e BLTAMOD
  317.     move.l    a0,$48(a5)    ; BLTCPT
  318.     move.w    d0,(a1)+    ; BLTAPTL
  319.     move.l    a0,(a1)+    ; BLTDPT
  320.     move.w    d3,(a1)        ; BLTSIZE
  321. .end:
  322.     rts
  323.  
  324. ;­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  325. ; se vogliamo eseguire linee per il fill, il codice ottante setta ad 1 il bit
  326. ; SING attraverso la costante SML
  327.  
  328.     IFNE    DL_Fill
  329. SML        =     2
  330.     ELSE
  331. SML        =    0
  332.     ENDC
  333.  
  334. ; tabella ottanti
  335.  
  336. Oktants:
  337.     dc.b    SML+1,SML+1+$40
  338.     dc.b    SML+17,SML+17+$40
  339.     dc.b    SML+9,SML+9+$40
  340.     dc.b    SML+21,SML+21+$40
  341.  
  342. ;******************************************************************************
  343. ; Questa routine setta i registri del blitter che non devono essere
  344. ; cambiati tra una line e l'altra
  345. ;******************************************************************************
  346.  
  347. InitLine
  348.     btst    #6,2(a5) ; dmaconr
  349. WBlit_Init:
  350.     btst    #6,2(a5) ; dmaconr - attendi che il blitter abbia finito
  351.     bne.s    Wblit_Init
  352.  
  353.     moveq.l    #-1,d5
  354.     move.l    d5,$44(a5)        ; BLTAFWM/BLTALWM = $FFFF
  355.     move.w    #$8000,$74(a5)        ; BLTADAT = $8000
  356.     move.w    #40,$60(a5)        ; BLTCMOD = 40
  357.     move.w    #40,$66(a5)        ; BLTDMOD = 40
  358.     rts
  359.  
  360. ;******************************************************************************
  361. ; Questa routine definisce il pattern che deve essere usato per disegnare
  362. ; le linee. In pratica si limita a settare il registro BLTBDAT.
  363. ; D0 - contiene il pattern della linea 
  364. ;******************************************************************************
  365.  
  366. SetPattern:
  367.     btst    #6,2(a5) ; dmaconr
  368. WBlit_Set:
  369.     btst    #6,2(a5) ; dmaconr - attendi che il blitter abbia finito
  370.     bne.s    Wblit_Set
  371.  
  372.     move.w    d0,$72(a5)    ; BLTBDAT = pattern
  373.     rts
  374.  
  375.  
  376. ;****************************************************************************
  377. ; Questa routine cancella lo schermo mediante il blitter.
  378. ;****************************************************************************
  379.  
  380. CancellaSchermo:
  381.     lea    bitplane,a0        ; indirizzo area da cancellare
  382.  
  383.     btst    #6,2(a5)
  384. WBlit3:
  385.     btst    #6,2(a5)         ; attendi che il blitter abbia finito
  386.     bne.s    wblit3
  387.  
  388.     move.l    #$01000000,$40(a5)    ; BLTCON0 e BLTCON1: Cancella
  389.     move    #$0000,$66(a5)        ; BLTDMOD=0
  390.     move.l    a0,$54(a5)        ; BLTDPT
  391.     move.w    #(64*256)+20,$58(a5)    ; BLTSIZE (via al blitter !)
  392.                     ; cancella tutto lo schermo
  393.     rts
  394.  
  395.  
  396. ;****************************************************************************
  397.  
  398.     SECTION    GRAPHIC,DATA_C
  399.  
  400. COPPERLIST:
  401.     dc.w    $8E,$2c81    ; DiwStrt
  402.     dc.w    $90,$2cc1    ; DiwStop
  403.     dc.w    $92,$38        ; DdfStart
  404.     dc.w    $94,$d0        ; DdfStop
  405.     dc.w    $102,0        ; BplCon1
  406.     dc.w    $104,0        ; BplCon2
  407.     dc.w    $108,0        ; Bpl1Mod
  408.     dc.w    $10a,0        ; Bpl2Mod
  409.  
  410.     dc.w    $100,$1200    ; Bplcon0 - 1 bitplane lowres
  411.  
  412. BPLPOINTERS:
  413.     dc.w    $e0,$0000,$e2,$0000    ;primo     bitplane
  414.  
  415.     dc.w    $0180,$000    ; color0
  416.     dc.w    $0182,$eee    ; color1
  417.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  418.  
  419. ;****************************************************************************
  420.  
  421.     Section    IlMioPlane,bss_C
  422.  
  423. BITPLANE:
  424.     ds.b    40*256        ; bitplane azzerato lowres
  425.  
  426.     end
  427.  
  428. ;****************************************************************************
  429.  
  430. In questo esempio vediamo come realizzare una linea che si muove sullo schermo.
  431. La linea viene disegnata ad ogni frame in una differente posizione.
  432. Le coordinate X e Y degli estremi della linea vengono lette da tabelle
  433. sinusoidali.
  434.  
  435.